package com.zjsru.plan2024.codeBase.fifty;

import java.util.Arrays;

/**
 * 1502. 判断能否形成等差数列
 * @Author: cookLee
 * @Date: 2024-06-23
 */
public class CanMakeArithmeticProgression {

    /**
     * 主
     * \
     * 输入：arr = [3,5,1]
     * 输出：true
     * 解释：对数组重新排序得到 [1,3,5] 或者 [5,3,1] ，任意相邻两项的差分别为 2 或 -2 ，可以形成等差数列。
     * \
     * 输入：arr = [1,2,4]
     * 输出：false
     * 解释：无法通过重新排序得到等差数列。
     * \
     * @param args args
     */
    public static void main(String[] args) {
        CanMakeArithmeticProgression canMakeArithmeticProgression = new CanMakeArithmeticProgression();
        int[] arr = new int[]{3,5,1};
        System.out.println(canMakeArithmeticProgression.canMakeArithmeticProgression(arr));
    }

    /**
     * 模拟
     *
     * @param arr arr
     * @return boolean
     */
    public boolean canMakeArithmeticProgression(int[] arr) {
        Arrays.sort(arr);
        for (int i = 2; i < arr.length; i++) {
            int curr = arr[i] - arr[i - 1];
            int last = arr[i - 1] - arr[i - 2];
            if (curr != last) {
                return false;
            }
        }
        return true;
    }

    /**
     * 哈希表
     *
     * @param arr arr
     * @return boolean
     */
    public boolean canMakeArithmeticProgression2(int[] arr) {
        if (arr.length < 3) {
            return true;
        }
        //获取最大最小值
        int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
        for (int num : arr) {
            if (num < min) {
                min = num;
            }
            if (num > max) {
                max = num;
            }
        }
        //判断是否可以等差
        if ((max - min) % (arr.length - 1) != 0) {
            return false;
        }
        //判断等差步长
        int step = (max - min) / (arr.length - 1);
        if (step == 0) {
            return true;
        }

        boolean[] exists = new boolean[arr.length];
        for (int num : arr) {
            //判断是否满足等差条件
            int remainder = (num - min) % step;
            if (remainder != 0) {
                return false;
            }
            //如果满足等差数组，那么下标不会重复而是按照逐步增加的
            int index = (num - min) / step;
            if (exists[index]) {
                return false;
            }
            exists[index] = true;
        }

        return true;
    }

}
